package com.vend.common

import android.app.Activity
import android.app.Application
import android.content.Context
import android.util.Log
import androidx.multidex.MultiDex
import com.alibaba.android.arouter.BuildConfig
import com.alibaba.android.arouter.launcher.ARouter
import com.hjq.permissions.XXPermissions
import com.hjq.toast.ToastUtils
import com.hjq.toast.style.ToastAliPayStyle
import com.vend.common.db.DBManager
import com.vend.common.log.LogInit
import com.vend.common.permission.PermissionInterceptor
import com.vend.common.task.ITask
import com.vend.common.task.TaskExecutorVend
import me.jessyan.autosize.AutoSize
import me.jessyan.autosize.AutoSizeConfig
import me.jessyan.autosize.onAdaptListener
import me.jessyan.autosize.utils.AutoSizeLog
import java.util.*

/**
 * Created by glendal on 2022/01/25.
 * 所有的Application初始化话的逻辑处理
 */
open class VendBaseApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        instance = this
        initRouter()
        initToast()
        TaskExecutorVend.call(VendApplicationBaseTask(this))
    }

    /**
     * ARouter初始化路由
     */
    private fun initRouter() {
        if (BuildConfig.DEBUG) {
            ARouter.openLog()   // 打印日志
            ARouter.openDebug() // 开启调试模式
        }
        ARouter.init(this) // 初始化
    }

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(base)
    }

    override fun onTerminate() {
        super.onTerminate()
//        ARouter销毁
        ARouter.getInstance().destroy()
    }
    companion object{
        var instance : VendBaseApplication ?= null
        fun instance(): VendBaseApplication? {
            return instance
        }

    }
    /**
     * 初始化吐司
     * 线程池的方式去处理
     */
    private fun initToast() {
        Log.e("tag","初始化Toast")
        // 初始化吐司工具类
        ToastUtils.init(
            this,
            ToastAliPayStyle(this)
        )
    }
    class VendApplicationBaseTask(private val self : VendBaseApplication) : ITask {
        override fun onExecute(): Boolean {
            initAutoSize()
            initPermission()
            initLoag()
            initDbManager()
            return true
        }

        override fun onError() {

        }





        /**
         * 初始化log日志
         */
        private fun initLoag(){
            LogInit.initLog()
        }

        /**
         * 权限请求框架
         */
        private fun initPermission(){
            // 设置权限申请拦截器（全局设置）
            XXPermissions.setInterceptor(PermissionInterceptor())
        }

        /**
         * 初始化数据库
         */
        private fun initDbManager(){
            //            //初始数据库
            DBManager.init(self)
        }
        /**
         * 初始化屏幕适配方案
         * preview 预览屏幕的创建规则
         * https://www.wanandroid.com/blog/show/2343
         */
        private fun initAutoSize(){
            //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
            //当 App 中出现多进程, 并且您需要适配所有的进程, 就需要在 App 初始化时调用 initCompatMultiProcess()
            AutoSize.initCompatMultiProcess(self)

            //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
            //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
//        AutoSize.checkAndInit(this);

//        如何控制 AndroidAutoSize 的初始化，让 AndroidAutoSize 在某些设备上不自动启动？https://github.com/JessYanCoding/AndroidAutoSize/issues/249

            /**
             * 以下是 AndroidAutoSize 可以自定义的参数, {@link AutoSizeConfig} 的每个方法的注释都写的很详细
             * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
             */

            //如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
            //可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
//        AutoSize.checkAndInit(this);

//        如何控制 AndroidAutoSize 的初始化，让 AndroidAutoSize 在某些设备上不自动启动？https://github.com/JessYanCoding/AndroidAutoSize/issues/249
            /**
             * 以下是 AndroidAutoSize 可以自定义的参数, [AutoSizeConfig] 的每个方法的注释都写的很详细
             * 使用前请一定记得跳进源码，查看方法的注释, 下面的注释只是简单描述!!!
             */
            AutoSizeConfig.getInstance() //是否让框架支持自定义 Fragment 的适配参数, 由于这个需求是比较少见的, 所以须要使用者手动开启
                //如果没有这个需求建议不开启
                .setCustomFragment(true).onAdaptListener = object : onAdaptListener {
                override fun onAdaptBefore(target: Any, activity: Activity?) {
                    //使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
                    //使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
                    //系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
                    //                        AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
                    //                        AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
                    AutoSizeLog.d(
                        String.format(
                            Locale.ENGLISH,
                            "%s onAdaptBefore!",
                            target.javaClass.name
                        )
                    )
                }

                override fun onAdaptAfter(target: Any, activity: Activity?) {
                    AutoSizeLog.d(
                        String.format(
                            Locale.ENGLISH,
                            "%s onAdaptAfter!",
                            target.javaClass.name
                        )
                    )
                }
            } //是否打印 AutoSize 的内部日志, 默认为 true, 如果您不想 AutoSize 打印日志, 则请设置为 false
            //                .setLog(false)
            //是否使用设备的实际尺寸做适配, 默认为 false, 如果设置为 false, 在以屏幕高度为基准进行适配时
            //AutoSize 会将屏幕总高度减去状态栏高度来做适配
            //设置为 true 则使用设备的实际屏幕高度, 不会减去状态栏高度
            //在全面屏或刘海屏幕设备中, 获取到的屏幕高度可能不包含状态栏高度, 所以在全面屏设备中不需要减去状态栏高度，所以可以 setUseDeviceSize(true)
            //                .setUseDeviceSize(true)
            //是否全局按照宽度进行等比例适配, 默认为 true, 如果设置为 false, AutoSize 会全局按照高度进行适配
            //                .setBaseOnWidth(false)
            //设置屏幕适配逻辑策略类, 一般不用设置, 使用框架默认的就好
            //                .setAutoAdaptStrategy(new AutoAdaptStrategy())

        }
    }
}